#pragma once
#include <string>

#include "Vector.h"

struct big_int
{
   big_int(const int64 digit = 0);
   big_int(const big_int&);
   big_int(const std::string);

   bool operator<(const big_int&) const;
   bool operator==(const big_int&) const;

   big_int& operator+=(const big_int&);
   big_int& operator-=(const big_int&);
   big_int& operator*=(const big_int&);
   big_int& operator*=(int64);
   big_int& operator/=(const big_int&);
   big_int& operator%=(const big_int&);

   big_int& operator=(const big_int&);

   void swap(big_int&);
   
private:
   Vector num;
   bool negative;

   big_int(const Vector&, bool);

   const static int64 base = 1000000000;
   const static int base_length = 9;

   friend big_int abs(big_int);
   friend big_int operator-(big_int);
   friend std::istream& operator>>(std::istream&, big_int&);
   friend std::ostream& operator<<(std::ostream&, const big_int&);
};

bool operator!=(const big_int&, const big_int&);
bool operator<=(const big_int&, const big_int&);
bool operator>=(const big_int&, const big_int&);
bool operator>(const big_int&, const big_int&);

big_int operator+(big_int, const big_int&);
big_int operator-(big_int, const big_int&);
big_int operator*(big_int, const big_int&);
big_int operator*(big_int, const int64);
big_int operator/(big_int, const big_int&);
big_int operator%(big_int, const big_int&);

void swap(big_int& a, big_int& b);
